Remediation scripts/Management ports of virtual machines should be protected with just-in-time network access control/PowerShell/Archive/Enable-JIT.ps1 (76 lines of code) (raw):

# Prepare Modules Write-Verbose "Checking for Azure module..." $AzModule = Get-Module -Name "Az.*" -ListAvailable if ($AzModule -eq $null) { Write-Verbose "Azure PowerShell module not found" # Check for Admin Privileges $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) $isadmin = ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) if($isadmin -eq $False){ # No Admin, install to current user Write-Warning -Message "Can not install Az Module. You are not running as Administrator" Write-Warning -Message "Installing Az Module to Current User Scope" Install-Module Az -Scope CurrentUser -Force Install-Module Az.Security -Scope CurrentUser -Force } Else{ # Admin, install to all users Install-Module Az -Force Install-Module Az.Security -Force } else { if ($AzModule.Name -notcontains "Az.Security") { Write-Verbose "Azure Security PowerShell module not found" if($isadmin -eq $False){ Write-Warning -Message "Can not install Az Security Module. You are not running as Administrator" Write-Warning -Message "Installing Az Security Module to Current User Scope" Install-Module Az.Security -Scope CurrentUser -Force } Else{ # Admin, install to all users Install-Module Az.Security -Force } } } } # Check/Set Execution Policy if ((Get-ExecutionPolicy).value__ -eq '3') { Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force } # Import Modules Import-Module Az Import-Module Az.Security # Login to Azure Login-AzAccount # Get All Subs $Subscriptions = Get-AzSubscription # Loop Through Subs for Tasks foreach($Subscription in $Subscriptions){ $Id = ($Subscription.Id) Select-AzSubscription $Id $SecurityTasks += Get-AzSecurityTask | Where-Object {$_.RecommendationType -eq "Just-In-Time network access control should be applied on virtual machines"} } # Enable JIT foreach($SecurityTask in $SecurityTasks){ $sub = $securityTask.Id.Split("/")[2] $vm = $securityTask.ResourceId.Split("/")[8] $vmlocation = (Get-AzVm -Name $vm).Location $vmrg = (Get-AzVm -Name $vm).ResourceGroupName # Create JIT Policy $JitPolicy = (@{ id="/subscriptions/${sub}/resourceGroups/${vmrg}/providers/Microsoft.Compute/virtualMachines/${vm}" ports=(@{ number=22; protocol="*"; allowedSourceAddressPrefix=@("*"); maxRequestAccessDuration="PT3H"}, @{ number=3389; protocol="*"; allowedSourceAddressPrefix=@("*"); maxRequestAccessDuration="PT3H"})} ) $JitPolicyArr=@($JitPolicy) # Set JIT Policy Set-AzJitNetworkAccessPolicy -Kind "Basic" -Location $vmlocation -Name "${vm}JITPolicy" -ResourceGroupName $vmrg -VirtualMachine $JitPolicyArr }